function ipToInt(ip) {
    return ip.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet, 10), 0) >>> 0;
}

function intToIp(int) {
    return [
        (int >>> 24) & 0xFF,
        (int >>> 16) & 0xFF,
        (int >>> 8) & 0xFF,
        int & 0xFF
    ].join('.');
}

function isValidIp(ip) {
    const octets = ip.split('.');
    if (octets.length !== 4) return false;
    return octets.every(octet => {
        const num = parseInt(octet, 10);
        return !isNaN(num) && num >= 0 && num <= 255;
    });
}

function calculateMatchingIps(ip, wildcardMask) {
    const ipInt = ipToInt(ip);
    const maskInt = ipToInt(wildcardMask);

    // 计算固定位和可变位
    const fixedBits = ipInt & ~maskInt;
    const variableMask = maskInt;

    // 计算可变位的数量
    let variableBitsCount = 0;
    for (let i = 0; i < 32; i++) {
        if ((variableMask >> i) & 1) {
            variableBitsCount++;
        }
    }

    // 检查可变位数量，避免生成过多IP地址
    if (variableBitsCount > 20) {
        throw new Error(`通配符掩码包含太多可变位（${variableBitsCount}位），可能导致性能问题`);
    }

    // 计算可能的IP地址数量 (2^variableBitsCount)
    const totalIps = 1 << variableBitsCount;
    console.log(`将生成 ${totalIps} 个匹配的IP地址...`);

    // 生成所有可能的IP地址
    const matchingIps = [];
    for (let i = 0; i < totalIps; i++) {
        let currentIp = fixedBits;
        let tempI = i;

        for (let bit = 0; bit < 32; bit++) {
            if ((variableMask >> bit) & 1) {
                currentIp |= ((tempI & 1) << bit);
                tempI >>= 1;
            }
        }

        matchingIps.push(intToIp(currentIp));
    }

    return matchingIps;
}

// 主函数
function main() {
    // 获取命令行参数（Node.js环境）
    const args = process.argv.slice(2);

    if (args.length !== 2) {
        console.error('用法: node ipWildcardMatcher.js <IP地址> <通配符掩码>');
        console.error('示例: node ipWildcardMatcher.js 192.168.1.1 0.0.0.3');
        process.exit(1);
    }

    const [ip, wildcardMask] = args;

    // 验证IP地址和通配符掩码
    if (!isValidIp(ip)) {
        console.error('无效的IP地址');
        process.exit(1);
    }

    if (!isValidIp(wildcardMask)) {
        console.error('无效的通配符掩码');
        process.exit(1);
    }

    try {
        let timed = Date.now()
        // 计算匹配的IP地址
        const matchingIps = calculateMatchingIps(ip, wildcardMask);
        timed = Date.now() - timed

        // 输出结果
        console.log(`与 ${ip} 匹配（通配符掩码：${wildcardMask}）的IP地址清单：`);
        matchingIps.forEach(ip => console.log(ip));

        // 打印总数
        console.log(`\n匹配的IP地址总数：${matchingIps.length}，耗时${timed}ms`);
    } catch (error) {
        console.error('错误：', error.message);
        process.exit(1);
    }
}

// 运行主函数
main();
